﻿using System;

/*
 * 创建人：
 * 
 * 时间：
 * 
 * 说明：
 * 
 * 
 * 修改说明：
 * 
 * 
 * 
 */


namespace ConsoleTest.ChapterOne
{
    /// <summary>
    /// 资源与本地化类笔记
    /// </summary>
    public class ResourceAndLocalization
    {
        /// <summary>
        /// 动态加载外部文件
        /// </summary>
        public static void UseOutFile()
        {
            //加载图片
            System.IO.Stream stream = System.IO.File.Open(@"..\..\1-程序集模块及IL\AlonePic.jpg",System.IO.FileMode.Open);

            System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(stream);

            bitmap.Save(@"..\..\1-程序集模块及IL\OutFileTest.jpg");
            stream.Close();
            System.Console.WriteLine("Done.");
        }

        /// <summary>
        /// 使用通过IDE添加方式添加的资源
        /// </summary>
        public static void UseIDEAddFile()
        {
            /*
             * 使用IDE 环境添加文件时，应当注意修改文件名称，否则资源文件名称过长；
             * 在resx文件的可视化环境中修改文件名称，VS 会自动查找所有的对该文件的引用，并自动
             * 更改文件名称为新的名称；
             */


            //访问图片资源
            System.Drawing.Bitmap bitmap = ConsoleTest._01_程序集基本概念.IDEAddRes.AlonePic;
            bitmap.Save(@"..\..\1-程序集模块及IL\IDEAddFile.jpg");
            //ConsoleTest.ChapterOne.IDEAddRes.AlonePic.Save(@"..\..\1-程序集模块及IL\IDEAddFile.jpg");


            //访问XML文档
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.LoadXml(ConsoleTest._01_程序集基本概念.IDEAddRes.XmlData);
            //逐一显示XML文件节点
            foreach (System.Xml.XmlNode node in doc.ChildNodes)
                global::ConsoleTest.XMLTest.DisplayNode(node, string.Empty); 

            //访问字符串资源
            System.Console.WriteLine("ConnectionString is:" + ConsoleTest._01_程序集基本概念.IDEAddRes.ConnectionString);
            
        }

        /// <summary>
        /// 使用通过IDE添加的资源
        /// </summary>
        public static void UseIDEAddFileRes()
        {
            System.Reflection.Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();
            string StrSourceName = "ConsoleTest._1_程序集基本概念.StandAlone.jpg";
            //从当前程序集加载指定的清单资源
            //string[] strArr = ass.GetManifestResourceNames();
            System.IO.Stream stream = ass.GetManifestResourceStream(StrSourceName);
            System.Drawing.Image img = System.Drawing.Image.FromStream(stream);
            img.Save(@"..\..\1-程序集模块及IL\IDEAddFileStream.jpg");

            ConsoleTest._01_程序集基本概念.IDEAddRes.test.Save(@"..\..\1-程序集模块及IL\test.jpg");
        }

       /// <summary>
       /// 访问手动添加的资源，即访问 resources 文件
       /// </summary>
        public static void UseManualAddFile()
        {
            //参数一：指定资源的名称。注意：应当包含资源的命名空间，如果不包含资源的命名空间，
            //              可能出现资源没有嵌入等错误。如下：


            //ResourceManager 的第一个构造函数  需要使用资源文件的完全限定名称，否则会出现
            /*
             * System.Resources.MissingManifestResourceException: 未能找到任何适合于指定的区域或非特定区域性的资源。
             * 请确保在编译时已将“****.****.Resource.resources”正确嵌入或链接到程序集"****"，或者确保所有需要的
             * 附属程序集都可加载并已进行了完全签名。
             * 
             * 第一个参数只需要 名称即可，不需要扩展名 resources
            */

            //参数二：资源的主程序集，此时程序集为当前运行的程序集，如果从外部资源程序集中加载，那么
            //                 应当指定资源所在的程序集。
            System.Resources.ResourceManager resman = new System.Resources.ResourceManager("ConsoleTest._1程序集模块及IL.ManualAddRes", System.Reflection.Assembly.GetExecutingAssembly());
            System.Console.WriteLine(resman.GetString("xmlpath"));
            System.Console.WriteLine(resman.GetString("picpath"));
        }

        /// <summary>
        /// 使用强类型资源类
        /// 该类是对已经存在的资源进行访问的一个封装，以简化对资源的访问操作
        /// </summary>
        public static void UseManualStrongResClass()
        {

            /*
             * 强类型资源类是resgen工具根据资源文件自动生成的资源访问类，其实质类似于强类型的DataSet；
             * 该工具生成的强类型资源类的代码与通过IDE方式添加资源时IDE自动生成的 Designer.cs文件是一样的
             */ 

            System.Console.WriteLine(ManualAddRes.xmlpath);
            System.Console.WriteLine(ManualAddRes.picpath);
        }

        /// <summary>
        /// 使用外部资源DLL程序集
        /// </summary>
        public static void UseOutterDLL()
        {
            //参数为添加的DLL文件的名称，不需要扩展名
            System.Reflection.Assembly ass = System.Reflection.Assembly.Load("OutDLLFile");
            
            //参数一：资源文件根名称
            System.Resources.ResourceManager resman = new System.Resources.ResourceManager("OutDLLFile", ass);
            string str = resman.GetString("XmlData");

            //访问XML文档
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.LoadXml(str);
            //逐一显示XML文件节点
            foreach (System.Xml.XmlNode node in doc.ChildNodes)
                global::ConsoleTest.XMLTest.DisplayNode(node, string.Empty);

            //显示图片
            ((System.Drawing.Bitmap)resman.GetObject("AlonePic")).Save(@"..\..\1-程序集基本概念\OutDllFile.jpg");
            
        }

        /// <summary>
        /// 使用区域资源文件
        /// </summary>
        public static void LoadCultureInfo()
        {
            //System.Threading.Thread t = System.Threading.Thread.CurrentThread;
            //System.Console.WriteLine("CurrentUICulture :"+t.CurrentUICulture.Name);
            //System.Console.WriteLine("CurrentCulture: "+t.CurrentCulture.Name);
            //System.Resources.ResourceManager resman = new System.Resources.ResourceManager("ConsoleTest", System.Reflection.Assembly.GetExecutingAssembly());
            //if (resman.GetResourceSet(new System.Globalization.CultureInfo("zh-CHS"), true, false)!=null)
            //{
            //    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");
            //    System.Console.WriteLine(resman.GetString("Language"));
            //}
            //else
            //{
            //    System.Console.WriteLine("Satellite assembly es-ES not found!");
            //}

            //System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

            //string[] strArr = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();

            //资源文件的名称
            //System.Resources.ResourceManager resman = new System.Resources.ResourceManager("ConsoleTest.Resources", System.Reflection.Assembly.GetExecutingAssembly());

            //System.Console.WriteLine(resman.GetString("Language"));

            System.ComponentModel.ComponentResourceManager comRes = new System.ComponentModel.ComponentResourceManager();
            if (comRes.GetResourceSet(new System.Globalization.CultureInfo("en-US"), true, false) != null)
            {
                System.Console.WriteLine(comRes.GetString("str1"));
            }
            
        }


    }
}